#include <iostream>
#include <vector>
#include <queue>
using  namespace  std;
//假设图是连通的

vector< vector<int> >v; //表示邻接表
const int maxsize=100;
int visited[maxsize];//0 1 2 表示三种状态 0未访问 1正在访问 2已经访问完   1-1 说明有环
bool flag[maxsize];
bool  dfs(int u)
{
    if(!visited[u])
    {
        visited[u]=1;
        for (int i = 0; i < v[u].size(); ++i) {
             if(visited[v[u][i]]==0)
             {

                 bool res=dfs(v[u][i]);
                 if(res==true)
                     return true;
             }
             else if(visited[v[u][i]]==1)
             {

                  return true;
             }
        }
    }
    visited[u]=2;
    return false;
}

void bfs(int u)
{
   queue<int>q;
   q.push(u);
   flag[u]=true;
   while(!q.empty())
   {
       int f=q.front();
       cout<<f<<" ";
       q.pop();
       for (int i = 0; i <v[f].size() ; ++i) {
           if(flag[v[u][i]]==false)
           {
               q.push(v[u][i]);
               flag[v[u][i]]=true;//标记入过队
           }
       }
   }

}
int main() {

    //初始化有向图
    int m,n;
    v.resize(100);

    cin>>m>>n;//边树和顶点树

    for(int i=0;i<n;++i)
    {
        visited[i]=0;
    }
    for (int i = 0; i < m; ++i) {
         int a,b;
         cin>>a>>b;
         v[a].push_back(b);
    }
    bfs(0);
//
    cout<<(dfs(0)==true?"该图有环":"该图无环");

    return 0;
}
